#include "key.h"

void KEY_SOS_Init(void); // 声明函数

uint8_t sosKeyState = 0;

/*
 *函数名称:KEY_Init
 *函数功能:初始化按键模块
 *参数:无
 *返回值:无
 *备  注:无
 */
void KEYs_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOE
    RCC_APB2PeriphClockCmd(KEYX_RCC_CLK, ENABLE);

    // 配置GPIOF引脚4和引脚3为输入上拉模式
    GPIO_InitStructure.GPIO_Pin = KEY0_PIN | KEY1_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(KEYX_PORT, &GPIO_InitStructure); // 初始化GPIOE
}

/*
 *函数名称:KEY_SOS_Init
 *函数功能:初始化SOS按键
 *参数:无
 *返回值:无
 *备  注:SOS按下时为高电平
 */
void KEY_SOS_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 使能GPIOF和复用时钟
    RCC_APB2PeriphClockCmd(KEYSOS_RCC_CLK | RCC_APB2Periph_AFIO, ENABLE);

    // 下拉模式
    GPIO_InitStructure.GPIO_Pin = KEYSOS_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 输入下拉模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(KEYSOS_PORT, &GPIO_InitStructure);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource3);

    EXTI_InitStructure.EXTI_Line = EXTI_Line3;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
    EXTI_Init(&EXTI_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

void EXTI3_IRQHandler(void)
{
    if (SOSKEYSTATE == Bit_SET) // 判断SOS按键是否被按下
    {
        SOS_LED = !SOS_LED;
        sosKeyState = 0;
    }

    // 清除中断标志位
    EXTI_ClearITPendingBit(EXTI_Line3);
}

// /*
//  *函数名称:isKeyPressed
//  *函数功能:按键处理函数
//  *参数mode:按键模式
//  *返回值:指定按键被按下的值
//  *备  注:返回值: 0:没有任何键按下,1:KEY0按下,2:KEY1按下;
//  *       参数:mode=0,不支持连续按下;mode=1,支持连续按下
//  */

// int isKeyPressed(uint8_t mode)
// {
//     static uint8_t key_up = 1; // 按键松开标志
//     if (mode)
//     {
//         key_up = 1; // 支持连续按下
//     }
//     if (key_up && ((KEY0_STATIC == Bit_RESET) || (KEY1_STATIC == Bit_RESET)))
//     {
//         delay_ms(10); // 消抖
//         key_up = 0;
//         if (KEY0_STATIC == Bit_RESET)
//         {
//             return KEY0_PRESSED; // 按键0按下
//         }
//         if (KEY1_STATIC == Bit_RESET)
//         {
//             return KEY1_PRESSED; // 按键1按下
//         }
//     }
//     else if (KEY0_STATIC == Bit_SET || KEY1_STATIC == Bit_SET)
//     {
//         key_up = 1; // 无按键按下
//     }

//     return 0;
// }
